package Presentacion.Reportes;

import java.awt.Desktop;
import java.awt.Frame;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.DecimalFormat;
import java.util.Iterator;
import java.util.List;
import java.util.StringTokenizer;

import javax.swing.JFileChooser;
import javax.swing.JOptionPane;

import Hibernate.Cliente;
import Hibernate.Dueno;
import Hibernate.Presupuesto;
import Hibernate.Vehiculo;
import Logica.ClienteLogica;
import Logica.DuenoLogica;
import Logica.PresupuestoLogica;
import Logica.VehiculoLogica;
import Logica.Validacion.PresupuestoValidacion;
import Logica.Validacion.Validacion;

import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.Image;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfWriter;

public class GeneraRepCliente {

	 private BaseFont bfBold;
	 private BaseFont bf;
	 private int pageNumber = 0;
	 private JFileChooser selecciona_archivo;
	 //ruta absoluta
	 private String ruta = "C:/AppCodigoTernario/Reportes/clientes/";
	 //72 puntos es una pulgada.
	 int xMin, xMax, yMin, yMax;
	 public int yLineaDesc;
	 int id;
	 
	 public GeneraRepCliente(int idCliente) {
		super();
		this.id = idCliente;
		//margenes
		xMin = 72;
		yMin = 72;

		boolean existe = false;
		String strFichero, pdfFilename, apYnom, fecha;
		File file;
		Frame frame = null;
		Cliente c = ClienteLogica.getById(idCliente);
		try{			
				fecha = Validacion.getFechaActual();
				apYnom = c.getApellido()+"_"+c.getNombre()+"-"+fecha;
//				pdfFilename = "";
//				selecciona_archivo = new JFileChooser();
//				selecciona_archivo.showSaveDialog(null);
//				pdfFilename = selecciona_archivo.getSelectedFile().toString();
				  
//				  if (args.length == 1)
//				  {
//				   System.err.println("Usage: java "+ this.getClass().getName()+
//				   " PDF_Filename");
//				   System.exit(1);
//				  }

//				  pdfFilename = args[0].trim();
				strFichero = ruta+apYnom+".pdf";
				file = new File(strFichero);
				existe = file.exists();
				
				if (existe){
					strFichero = ruta+"(1)"+apYnom+".pdf";
				}
			  this.createPDF(strFichero);
			  
			  this.abrirarchivo(strFichero);
		}catch (Exception e){
			System.out.println("excepcion: "+e.getMessage());
		}
		
		  
	}

	public static void main() {
	   GeneraRepVehiculo gi = new GeneraRepVehiculo(4);

	 }

	 private void createPDF (String pdfFilename){

	  Document doc = new Document();
	  PdfWriter docWriter = null;
	  initializeFonts();

	  try {
	   String path = pdfFilename;
	   docWriter = PdfWriter.getInstance(doc , new FileOutputStream(path));
	   doc.addAuthor("Centis, Luciano");
	   doc.addCreationDate();
	   doc.addProducer();
	   doc.addCreator("Código Ternario");
	   doc.addTitle("Reporte Cliente");
	   doc.setPageSize(PageSize.A4);

	   doc.open();
	   PdfContentByte cb = docWriter.getDirectContent();
	   
	   boolean beginPage = true;
	   boolean beginDueno = true;
	   yLineaDesc = 0;

	   Cliente obj;
	   obj = ClienteLogica.getById(id);
	   List<Dueno> listDueno = DuenoLogica.getByIdCliente(id);
	   Vehiculo v;

	   List<Presupuesto> listP;
	   Presupuesto p;
//	   = PresupuestoLogica.listarPPatente(obj.getPatente());
	   
	   String nomYapellido = obj.getApellido()+", "+obj.getNombre();
	   String dir = obj.getDireccion();
	   String tel = obj.getTelefono();
	   String mail = obj.getEmail();
	   
	   String marcYmod, patente, ano, color;
	   
	   Iterator<Dueno> it = listDueno.iterator();
	   Iterator<Presupuesto> itP;
	   Dueno d;
	   
	   while( it.hasNext() ){
		   d = it.next();
		   itP = PresupuestoLogica.listarPPatente(d.getPatente()).iterator();
		   beginDueno = true;		   
		   while( itP.hasNext() ){
			   p = itP.next();
		       if(beginPage){
				     beginPage = false;
				     generateLayout(doc, cb); 
				     generateHeader(doc, cb, nomYapellido, dir, tel, mail);
				     yLineaDesc = 585;				    
		       }
		       if (beginDueno){
		    	   generateDetailDueno(doc, cb, d);
		    	   beginDueno = false;
		       }
		       
			    generateDetailPresupuesto(doc, cb, p.getIdpresupuesto());
			    yLineaDesc -= 15;
			    if(yLineaDesc < 30){
				     printPageNumber(cb);
				     doc.newPage();
				     beginPage = true;
				     beginDueno = true;
		    }
		   }//end WHILE( itP.hasNext() )
	   } //end WHILE( it.hasNext() )
	   printPageNumber(cb);

	  }
	  catch (DocumentException dex)
	  {
		  dex.printStackTrace();
	  }
	  catch (Exception ex)
	  {
		  ex.printStackTrace();
	  }
	  finally
	  {
		   if (doc != null)
		   {
			   doc.close();
		   }
		   if (docWriter != null)
		   {
			   docWriter.close();
		   }
	  }
	 }

	 private void generateLayout(Document doc, PdfContentByte cb)  {

	  try { //DIBUJO CONTORNO DE PRESUPUESTO

	   cb.setLineWidth(1f);
	   int xIni, yIni, xSize, ySize;
	   xSize = 500;
	   ySize = 120;
	   xIni = 50;
	   yIni = 680;
	   // Invoice Header box layout

	   cb.rectangle(xIni,yIni,xSize,ySize);
	   cb.moveTo((xIni + xSize/2 - 15), yIni);
	   cb.lineTo((xIni + xSize/2 - 15), yIni+ySize);
	   cb.moveTo((xIni + xSize/2 + 30), yIni);
	   cb.lineTo((xIni + xSize/2 + 30), yIni+ySize);

	   cb.stroke();
	   yIni -= 3; 
	   ySize = 50;
	   yIni -= ySize;
	   
	   cb.rectangle(xIni,yIni,xSize,ySize);

	   // Invoice Detail box layout 
	   yIni -= 3;
	   ySize = 460;
	   yIni -= ySize;
	   
	   cb.rectangle(xIni,yIni,xSize,ySize);
	   xIni += 45;
	   cb.moveTo(xIni, yIni);
	   cb.lineTo(xIni, ySize+yIni);
	   xIni += 400;
	   cb.moveTo(xIni, yIni);
	   cb.lineTo(xIni, ySize+yIni);
	   int yH = ySize + yIni - 20;
	   int xH = 50;
	   cb.moveTo(xH, yH);
	   cb.lineTo(xH + xSize, yH);
	   yH -= ySize - 40;
	   cb.moveTo(xH, yH);
	//   cb.lineTo(xH + xSize, yH);
	   
	   yH -= 70;
	   xH += 400;
	   cb.moveTo(xH, yH);
	   cb.lineTo(xH + 100, yH);
	   
	   cb.stroke();

	   // Invoice Detail box Text Headings COLUMNAS DETALLES PRESUPUESTO
	   int y = 610;
	   createHeadings(cb,54,y,"Cantidad");
	   createHeadings(cb,100,y,"Descripción");
	   createHeadings(cb,500,y,"Precio $");

	   //add the images
	//   Image companyLogo = Image.getInstance("src/Pruebas/olympics_logo.gif");
	//   companyLogo.setAbsolutePosition(25,700);
	//   companyLogo.scalePercent(25);
	//   doc.add(companyLogo);
	  } //catch de la carga de imagen
	//  catch (DocumentException dex){
	//   dex.printStackTrace();
	//  }
	  catch (Exception ex){
	   ex.printStackTrace();
	  }

	 }
	 
	 private void generateHeader(Document doc, PdfContentByte cb, String nomYAp, String dir, String tel, String mail)  {

	  try { //GENERAR ENCABEZADO DE PRESUPUESTO.
		  
	   createHeadings(cb,55,780,"Electrónica Mitre");
	   createHeadings(cb,55,765,"Mitre 721");
	   createHeadings(cb,55,750,"Malabrigo (Santa Fe)");
	   createHeadings(cb,55,735,"CP 3572");
	   createHeadings(cb,55,720,"03482-15500444");
	  
	   String date = Validacion.getFechaActualPresupuesto();
	   createHeadings(cb,500,785,date);
	   
	   createHeadings(cb,55,660,"Cliente:");
	   createHeadings(cb,55,640,"Teléfono:");
	   createHeadings(cb,300,660,"E-Mail:");
	   createHeadings(cb,300,640,"Dirección:");
	   
	   createHeadings(cb,350,770,"* Inyección electrónica.");
	   createHeadings(cb,350,755,"* Escaneo - diagnóstico.");
	   createHeadings(cb,350,740,"* Motores de arranque.");
	   createHeadings(cb,350,725,"* Alternadores.");
	   
	//   createHeadings(cb,460,170,"Total:");
	   createHeadings(cb,490,100,"Firma");
	   
	   
	   int xPr = 305;
	   int yPr = 790;
	   int descuento = 10;
	   createHeadings(cb, xPr, yPr, ""); yPr -= descuento;
	   createHeadings(cb, xPr, yPr, ""); yPr -= descuento;
	   createHeadings(cb, xPr, yPr, "R"); yPr -= descuento;
	   createHeadings(cb, xPr, yPr, "E"); yPr -= descuento;
	   createHeadings(cb, xPr, yPr, "P"); yPr -= descuento;
	   createHeadings(cb, xPr, yPr, "O"); yPr -= descuento;
	   createHeadings(cb, xPr, yPr, "R"); yPr -= descuento;
	   createHeadings(cb, xPr, yPr, "T"); yPr -= descuento;
	   createHeadings(cb, xPr, yPr, "E"); yPr -= descuento;
	   createHeadings(cb, xPr, yPr, ""); yPr -= descuento;
	   createHeadings(cb, xPr, yPr, ""); 
	   
	   	  
	   createContent(cb, 100, 660, nomYAp, PdfContentByte.ALIGN_LEFT);
	   createContent(cb, 100, 640, tel, PdfContentByte.ALIGN_LEFT);	  
	   createContent(cb, 360, 660, mail, PdfContentByte.ALIGN_LEFT);
	   createContent(cb, 360, 640, dir, PdfContentByte.ALIGN_LEFT);
	   
	  }

	  catch (Exception ex){
	   ex.printStackTrace();
	  }

	 }
	 
	 private void generateDetailPresupuesto(Document doc, PdfContentByte cb, int idP)  {
	  DecimalFormat df = new DecimalFormat("0.00");
	  
	  try {	 	  
		  int xIni;	  
		  xIni = 120;
		  int price = PresupuestoLogica.getByid(idP).getImporte();
		  String trabajo = PresupuestoLogica.getByid(idP).getTrabajos();
		  
		  createContent(cb, 70, yLineaDesc, "1", PdfContentByte.ALIGN_LEFT);
		  createContent(cb,540,yLineaDesc, df.format(price),PdfContentByte.ALIGN_RIGHT);
//		  createContent(cb,510,170, df.format(price),PdfContentByte.ALIGN_LEFT);
		  
//		  String str= obj.getTrabajos();
		  StringTokenizer token = new StringTokenizer(trabajo);
		  String aux, word, fecha;
		  fecha = Validacion.getFechaSTR(PresupuestoLogica.getByid(idP).getFechaemision());
		  aux = fecha;
//		  aux = "";
		  boolean conf = PresupuestoLogica.getByid(idP).isTrabajo();
		  if(conf){
			  aux += " - TRABAJO: "; 
		  }else{
			  aux += " - PRESUPUESTO: ";
		  }
			  
		  while (token.hasMoreElements()) {
			  do{
				  word = token.nextElement().toString();
				  System.out.println(word);
				  
				  aux += " "+word.toString();
				  	
			  }	 while((aux.length()+word.length()+1 < 100) && token.hasMoreElements());
			  createContent(cb,xIni,yLineaDesc,aux,PdfContentByte.ALIGN_LEFT);		
				  
		      yLineaDesc -= 15;
			  aux = "";	
			  
			  //agregarle el estado de cuenta corriente??
			}      
	  }

	  catch (Exception ex){
	   ex.printStackTrace();
	  }

	 }
	 
	 private void generateDetailDueno(Document doc, PdfContentByte cb, Dueno d)  {
		  try {	 			  
			 Vehiculo v = VehiculoLogica.getById(d.getIdvehiculo());
			 String marcYmod = v.getMarca()+", "+v.getModelo();
			 String ano = d.getColor();
			 String color = d.getColor();
			 String patente = d.getPatente();	
			 
			 String vehiculo = marcYmod+"  |  "+patente+"  |  "+ano+"  |  "+color;			   
			  int xIni;	  
			  xIni = 100;			  
			  createContent(cb, xIni, yLineaDesc, vehiculo, PdfContentByte.ALIGN_LEFT);
			  yLineaDesc -= 15; 
			  
		  }

		  catch (Exception ex){
		   ex.printStackTrace();
		  }

		 }
	 
	 

	 private void createHeadings(PdfContentByte cb, float x, float y, String text){
	  cb.beginText();
	  cb.setFontAndSize(bfBold, 8);
	  cb.setTextMatrix(x,y);
	  cb.showText(text.trim());
	  cb.endText(); 
	 }
	 
	 private void printPageNumber(PdfContentByte cb){
	  cb.beginText();
	  cb.setFontAndSize(bfBold, 8);
	  cb.showTextAligned(PdfContentByte.ALIGN_RIGHT, "Pagina N°. " + (pageNumber+1), 570 , 25, 0);
	  cb.endText(); 
	  
	  pageNumber++;
	  
	 }
	 
	 private void createContent(PdfContentByte cb, float x, float y, String text, int align){


	  cb.beginText();
	  cb.setFontAndSize(bf, 8);
	  cb.showTextAligned(align, text.trim(), x , y, 0);
	  cb.endText(); 

	 }

	 private void initializeFonts(){


	  try {
	   bfBold = BaseFont.createFont(BaseFont.HELVETICA_BOLD, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
	   bf = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);

	  } catch (DocumentException e) {
	   e.printStackTrace();
	  } catch (IOException e) {
	   e.printStackTrace();
	  }


	 }
	 
	 public void abrirarchivo(String archivo){
	     try {  File objetofile = new File (archivo);
	            Desktop.getDesktop().open(objetofile);
	     }catch (IOException ex) {
	            System.out.println(ex);
	     }
	   }

}
